Svm patch to fix asid logic on multicore.
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Sat, 18 Feb 2006 00:01:52 +0000 (01:01 +0100)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Sat, 18 Feb 2006 00:01:52 +0000 (01:01 +0100)
Signed-off-by: Tom Woller <thomas.woller@amd.com>
xen/arch/x86/hvm/svm/svm.c

index 44b6b78e73f73effc3f5a65153b9a80af8f3b673..d02002d334299431975f9f7b6fdcee71945be65e 100644 (file)
@@ -2666,18 +2666,22 @@ asmlinkage void svm_asid(void)
     struct vcpu *v = current;
     struct vmcb_struct *vmcb = v->arch.hvm_svm.vmcb;
     int core = smp_processor_id();
+    int oldcore = v->arch.hvm_svm.core; 
     /* 
      * if need to assign new asid or if switching cores, 
      * then retire asid for old core, and assign new for new core.
      */
-    if( svm_dbg_on)
-        printk("old core %d new core %d\n",(int)v->arch.hvm_svm.core,(int)core);
-
+    if( v->arch.hvm_svm.core != core ) {
+        if (svm_dbg_on)
+            printk("old core %d new core %d\n",(int)v->arch.hvm_svm.core,(int)core);
+        v->arch.hvm_svm.core = core;
+    }
     if( test_bit(ARCH_SVM_VMCB_ASSIGN_ASID, &v->arch.hvm_svm.flags) ||
-          (v->arch.hvm_svm.core != core)) {
+          (oldcore != core)) {
         if(!asidpool_assign_next(vmcb, 1, 
-                   v->arch.hvm_svm.core, core)) {
-           BUG();              
+                   oldcore, core)) {
+            /* If we get here, we have a major problem */
+            domain_crash_synchronous();
         }
     }
     clear_bit(ARCH_SVM_VMCB_ASSIGN_ASID, &v->arch.hvm_svm.flags);